<?php

namespace application\service;

use application\service\BaseService;
use core\entity\Page;
use core\entity\Query;
use core\entity\Criteria;
use application\entity\db\User;
use application\model\UserModel;
use application\entity\Response;
use application\util\TextUtil;
use application\entity\input\UserSearch;

class UserService extends BaseService {

    private $userModel;

    public function __construct() {
        $this->userModel = new UserModel();
    }

    /**
     * Tìm kiếm theo điều kiện search
     * @param UserSearch $search
     * @return type
     */
    public function search(UserSearch $search) {
        $cri = new Criteria();
        if (TextUtil::getVariable($search, 'email', null) != null) {
            $cri->andKey('email')->regex('%' . $search->email . '%');
        }
        if (TextUtil::getVariable($search, 'name', null) != null) {
            $cri->andKey('name')->regex('%' . $search->name . '%');
        }
        $page = new Page();
        $page->pageIndex($search->pageIndex, $search->pageSize);
        $dataPage = $this->userModel->iSearch($cri, $page);
        return $dataPage;
    }

    /**
     * Thêm mới tài khoản người dùng
     * @param \application\enity\db\User $user
     * @return \application\enity\Response
     */
    public function add(User $user) {
        if ($user == null) {
            return new Response(false, "Thông tin truyền chưa chính xác");
        }
        $user->id = '';
        $error = array();
        if (TextUtil::getVariable($user, 'email', null) == null) {
            $error[] = "Địa chỉ email không được để trống";
        }
        if (TextUtil::getVariable($user, 'password', null) == null) {
            $error[] = "Mật khẩu không được để trống";
        }
        if (TextUtil::getVariable($user, 'phone', null) == null) {
            $error[] = "Số điện thoại không được để trống";
        }

        if (!empty($error)) {
            return new Response(false, "Thêm tài khoản không thành công!", $error);
        }

        if ($this->userModel->isave($user)) {
            $user->id = $this->userModel->getId();
            return new Response(true, "Thêm mới tài khoản thành công", $user);
        }
        return new Response(false, "Thêm tài khoản không thành công!", $this->userModel->error());
    }

    /**
     * Cập nhật thông tin tài khoản
     * @param \application\enity\db\User $user
     * @return \application\enity\Response
     */
    public function edit(User $user) {
        if ($user == null) {
            return new Response(false, "Thông tin truyền chưa chính xác");
        }
        if (!isset($user->id) || $user->id == null || $user->id == '') {
            return new Response(false, "Mã tài khoản không được để trống khi sửa");
        }
        $error = array();
        if (TextUtil::getVariable($user, 'phone', null) == null) {
            $error["phone"] = "Số điện thoại không được để trống";
        }

        if (!empty($error)) {
            return new Response(false, "Cập nhật thông tin không thành công!", $error);
        }
        $data = $this->userModel->ifindById($user->id);
        $data->phone = $user->phone;
        $data->address = $user->address;
        $data->name = $user->name;
        if ($this->userModel->isave($data)) {
            return new Response(true, "Cập nhật thông tin tài khoản thành công", $user);
        }
        return new Response(false, "Cập nhật thông tin không thành công!", $this->userModel->error());
    }

    /**
     * Lấy thông tin tài khoản theo id
     * @param type $id
     * @return User
     */
    public function get($id) {
        $user = $this->userModel->ifindById($id);
        if ($user == null) {
            throw new Exception("Không tìm thấy tài khoản yêu cầu");
            return;
        }
        return $user;
    }

    /**
     * Tìm kiếm thông tin người dùng theo email
     * @param type $email
     * @return User
     * @throws Exception
     */
    public function getByEmail($email) {
        $cri = new Criteria();
        $cri->andKey("email")->is($email);
        $query = new Query($cri);
        $user = $this->userModel->ifindOne($query);
        if ($user == null) {
            throw new Exception("Không tìm thấy tài khoản yêu cầu");
            return;
        }
        return $user;
    }

    /**
     * Xóa người dùng theo id
     * @param type $id
     * @return \application\entity\Response
     */
    public function remove($id) {
        $cri = new Criteria();
        $cri->andKey("id")->is($id);
        if ($this->userModel->idelete($cri)) {
            return new Response(true, "Xóa người dùng thành công");
        }
        return new Response(false, "Có lỗi xảy ra trong quá trình xử lý, không thể xóa người dùng này", $this->userModel->error());
    }

}
